const bcrypt = require('bcryptjs')

const { getUserInfo  } = require('../service/user.service')
const { userFormatError, userAlreadyExisted, userRegisterError, userDontExist, userLoginError, invalidPassword } = require('../constant/error.type')

// 验证用户名密码合法性
const userValidator = async (ctx, next) => {
  const { user_name, password } = ctx.request.body
  // 合法性
  if(!user_name || !password) {
    console.error('用户名或密码为空', ctx.request.body) // 错误日志打印
    ctx.app.emit('error', userFormatError, ctx)
    return
  }
  await next()
}

// 验证用户是否存在
const verifyUser = async (ctx, next) => {
  const { user_name } = ctx.request.body
  // 合理性 getUserInfo({ user_name })返回的promise对象，恒为真，通过await 获取promise的值
  // if(await getUserInfo({ user_name })) {
  //   ctx.app.emit('error', userAlreadyExisted, ctx)
  //   return
  // }
  try {
    const res = await getUserInfo({ user_name })
    if(res) {
      console.error('用户名已经存在', { user_name })
      ctx.app.emit('error', userAlreadyExisted, ctx)
      return
    }
  } catch (error) {
    console.error('获取用户信息错误', error)
    ctx.app.emit('error', userRegisterError, ctx)
  }

  await next()
}

// 密码加密
const cryptPassword = async (ctx, next) => {
  const { password } = ctx.request.body

  const salt = bcrypt.genSaltSync(10)
  // hash保存的是加盐后的密码 的 密文
  const hash = bcrypt.hashSync(password, salt)

  ctx.request.body.password = hash

  await next()
}

// 验证用户登录
const verifyLogin = async (ctx, next) => {
  const { user_name, password } = ctx.request.body
  try {
    // 1. 判断用户是否存在（不存在：报错）
    const res = await getUserInfo({ user_name })

    if(!res) {
      console.error('用户名不存在', { user_name })
      return ctx.app.emit('error', userDontExist, ctx)
    }
    // 2. 密码是否匹配（不匹配：报错）
    if(!bcrypt.compareSync(password, res.password)) {
      console.error('密码错误', { user_name, password })
      return ctx.app.emit('error', invalidPassword, ctx)
    }
  } catch (error) {
    console.error('获取用户信息错误', error)
    ctx.app.emit('error', userLoginError, ctx)
  }

  await next()
}


module.exports = {
  userValidator,
  verifyUser,
  cryptPassword,
  verifyLogin
}